package com.redepronik.negosysres.invfac.controller;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.entity.Detalleegreso;
import com.redepronik.negosys.invfac.entity.Egreso;
import com.redepronik.negosys.invfac.entityAux.CantidadFactura;
import com.redepronik.negosys.invfac.entityAux.FacturaReporte;
import com.redepronik.negosys.invfac.service.EgresoService;
import com.redepronik.negosys.rrhh.entity.Persona;
import com.redepronik.negosys.rrhh.service.ClienteService;
import com.redepronik.negosys.rrhh.service.PersonaService;
import com.redepronik.negosysres.invfac.report.EgresoReport;

@Controller
@Scope("session")
public class ListadoFacturaBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Autowired
	private FacturaBean facturaBean;

	@Autowired
	private EgresoService egresoService;

	@Autowired
	private ClienteService clienteService;

	@Autowired
	private EgresoReport egresoReport;

	@Autowired
	private PersonaService personaService;

	private List<Egreso> listaEgresos;
	private String criterioBusquedaCliente;
	private String criterioBusquedaCodigo;
	private String criterioBusquedaDetalle;
	private Integer criterioBusquedaEstado;
	private List<FacturaReporte> listaEgresosDetalle;
	private Egreso egreso;
	private String login = "";
	private String pass = "";

	public ListadoFacturaBean() {
		egreso = new Egreso();
	}

	public void convertirFactura() {
		facturaBean.convertirFactura(egreso);
		try {
			FacesContext.getCurrentInstance().getExternalContext()
					.redirect("factura.jsf");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void convertirFacturaInterna() {
		presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_INFO, "DUPLICO",
				"FACTURA: " + egreso.getCodigodocumento()));
		egresoService.insertar(egresoService.duplicarEgreso(egreso, 9), null);
		egreso.setFacturainterna(true);
		egresoService.actualizar(egreso, null);
	}

	public void eliminar() {
		presentaMensaje(egresoService.eliminar(egreso, login, pass));
		login = "";
		pass = "";
	}

	public void generarListaDetalle() {
		listaEgresosDetalle = new ArrayList<FacturaReporte>();
		List<Detalleegreso> list = egreso.getDetalleegresos();
		for (Detalleegreso de : list) {
			listaEgresosDetalle.add(egresoService.asignar(de, null, 1));
		}
	}

	public String getCriterioBusquedaCliente() {
		return criterioBusquedaCliente;
	}

	public String getCriterioBusquedaCodigo() {
		return criterioBusquedaCodigo;
	}

	public String getCriterioBusquedaDetalle() {
		return criterioBusquedaDetalle;
	}

	public Integer getCriterioBusquedaEstado() {
		return criterioBusquedaEstado;
	}

	public Egreso getEgreso() {
		return egreso;
	}

	public List<Egreso> getListaEgresos() {
		return listaEgresos;
	}

	public List<FacturaReporte> getListaEgresosDetalle() {
		return listaEgresosDetalle;
	}

	public String getLogin() {
		return login;
	}

	public String getPass() {
		return pass;
	}

	public void imprimirFactura() {
		Persona cliente = clienteService.obtenerPorClienteId(egreso
				.getCliente().getClienteid());

		CantidadFactura cantidadFactura = new CantidadFactura();
		cantidadFactura.setDescuentoEgreso(egreso.getDescuento());
		List<FacturaReporte> listFacturaReporte = new ArrayList<FacturaReporte>();
		for (Detalleegreso detalleEgreso : egreso.getDetalleegresos()) {
			FacturaReporte fr = egresoService.asignar(detalleEgreso, null,
					egreso.getTipodocumento().getTipodocumentoid());
			cantidadFactura = egresoService.calcularCantidadFactura(
					cantidadFactura, fr, "add");
			listFacturaReporte.add(fr);
		}

		egresoReport.reporteFactura(egreso, cliente, cantidadFactura,
				listFacturaReporte);
	}

	public void limpiarObjetos() {
		criterioBusquedaCliente = new String();
		criterioBusquedaCodigo = new String();
		criterioBusquedaDetalle = new String();
		criterioBusquedaEstado = 0;
	}

	public void obtener() {
		if (criterioBusquedaEstado == 0
				&& criterioBusquedaCliente.compareToIgnoreCase("") == 0
				&& criterioBusquedaCodigo.compareToIgnoreCase("") == 0
				&& criterioBusquedaDetalle.compareToIgnoreCase("") == 0)
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "INGRESE UN CRITERIO DE BUSQUEDA"));
		else {
			if (criterioBusquedaCliente.length() >= 1
					&& criterioBusquedaCliente.length() <= 4) {
				presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"MENSAJE DEL SISTEMA",
						"INGRESE MAS DE 4 CARACTERES PARA LA BÚSQUEDA POR CLIENTES"));
			} else if (!criterioBusquedaCodigo.matches("[0-9]*")) {
				presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"MENSAJE DEL SISTEMA",
						"INGRESE SOLO NÚMEROS PARA LA BÚSQUEDA POR DOCUMENTOS"));
			} else if (criterioBusquedaCodigo.compareToIgnoreCase("") != 0
					&& criterioBusquedaCodigo.charAt(0) == '0') {
				presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"MENSAJE DEL SISTEMA",
						"NO SE PERMITE CEROS AL INICIO PARA LA BÚSQUEDA POR DOCUMENTOS"));
			} else if (criterioBusquedaDetalle.length() >= 1
					&& criterioBusquedaDetalle.length() <= 3) {
				presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"MENSAJE DEL SISTEMA",
						"INGRESE MAS DE 3 CARACTERES PARA LA BÚSQUEDA POR PRODUCTOS"));
			} else {
				listaEgresos = egresoService.obtener(criterioBusquedaEstado,
						criterioBusquedaCliente.toUpperCase(),
						criterioBusquedaCodigo.toUpperCase(),
						criterioBusquedaDetalle.toUpperCase(), 1);
				if (listaEgresos.isEmpty()) {
					presentaMensaje(new FacesMessage(
							FacesMessage.SEVERITY_INFO, "MENSAJE DEL SISTEMA",
							"NO SE ENCONTRARON COINCIDENCIAS"));
				}
				limpiarObjetos();
			}
		}
	}

	private void presentaMensaje(FacesMessage message) {
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	public void setCriterioBusquedaCliente(String criterioBusquedaCliente) {
		this.criterioBusquedaCliente = criterioBusquedaCliente;
	}

	public void setCriterioBusquedaCodigo(String criterioBusquedaCodigo) {
		this.criterioBusquedaCodigo = criterioBusquedaCodigo;
	}

	public void setCriterioBusquedaDetalle(String criterioBusquedaDetalle) {
		this.criterioBusquedaDetalle = criterioBusquedaDetalle;
	}

	public void setCriterioBusquedaEstado(Integer criterioBusquedaEstado) {
		this.criterioBusquedaEstado = criterioBusquedaEstado;
	}

	public void setEgreso(Egreso egreso) {
		this.egreso = egreso;
	}

	public void setListaEgresos(List<Egreso> listaEgresos) {
		this.listaEgresos = listaEgresos;
	}

	public void setListaEgresosDetalle(List<FacturaReporte> listaEgresosDetalle) {
		this.listaEgresosDetalle = listaEgresosDetalle;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

}